/*******************************************
 * Programme fait par Philippe Deslauriers,*
 * Vincent Fournier et Patrice Deschenes   *
 *------DA: 0942586,0942346,0953009--------*
 * Travail presente a : Mathieu Grenon     *
 * Dans le cadre du cour d'informatique    *
 ******************************************/
package tp2;

import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

/******************************************************************************
 *******************************Fenetre****************************************
 ******************************************************************************/
/**
 *Cette classe crée le JFrame pour le jeu et elle gère le menubar en plus de tout
 * initiliaser les composants du jeu
 *
 */
public class Fenetre extends JFrame {
    // Panel

    // Élément du menuBar
    MenuBar monMenu;
    Menu mnuFichier;
    Menu mnuAide;
    MenuItem mnuFNewGame;
    MenuItem mnuFOpenGame;
    MenuItem mnuFSave;
    MenuItem mnuFExit;
    MenuItem mnuAHelp;
    MenuItem mnuAStats;
    MenuItem mnuAPropos;
    JPanel pnlPrincipal = new JPanel();
    Jeu pnlJeu = new Jeu(this);
    MenuPrincipal menu = new MenuPrincipal(this);
    Options pnlOptions = new Options(this);
    private static int[] nbVictoire = new int[4];

    public Fenetre() {
        initMenu();


        pnlPrincipal.add(menu);
        pnlPrincipal.setLayout(new GridLayout(1, 1));
        this.add(pnlPrincipal);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setMenuBar(monMenu);
        this.setSize(650, 440);
        this.setResizable(false);
        this.setVisible(true);
    }

    /**
     * Initialise le menuBar
     */
    private void initMenu() {
        monMenu = new MenuBar();
        mnuFichier = new Menu("Fichier");
        mnuAide = new Menu("?");
        mnuFNewGame = new MenuItem("Nouvelle partie");
        mnuFOpenGame = new MenuItem("Ouvrir une partie...");
        mnuFSave = new MenuItem("Sauvegarder la partie...");
        mnuFExit = new MenuItem("Quitter");
        mnuAHelp = new MenuItem("Aide...");
        mnuAStats = new MenuItem("Satistiques...");
        mnuAPropos = new MenuItem("À Propos...");

        mnuFSave.setEnabled(false);

        mnuFNewGame.addActionListener(new GererEvenement());
        mnuFOpenGame.addActionListener(new GererEvenement());
        mnuFSave.addActionListener(new GererEvenement());
        mnuFExit.addActionListener(new GererEvenement());
        mnuAHelp.addActionListener(new GererEvenement());
        mnuAStats.addActionListener(new GererEvenement());
        mnuAPropos.addActionListener(new GererEvenement());

        mnuFichier.add(mnuFNewGame);
        mnuFichier.add(mnuFOpenGame);
        mnuFichier.add(mnuFSave);
        mnuFichier.addSeparator();
        mnuFichier.add(mnuFExit);

        mnuAide.add(mnuAHelp);
        mnuAide.add(mnuAStats);
        mnuAide.addSeparator();
        mnuAide.add(mnuAPropos);

        monMenu.add(mnuFichier);
        monMenu.add(mnuAide);

    }
/**
 * Initialise le panneau jeu
 */
    public void initJeu() {
        mnuFSave.setEnabled(true);
        pnlPrincipal.removeAll();
        pnlJeu.initJeu();
        pnlPrincipal.add(pnlJeu);
        pnlPrincipal.getRootPane().revalidate();
        pnlPrincipal.repaint();
       
    }
/**
 * Sert à réinitialiser le jeu lors des sauvegardes
 */
    public void initGentilJeu() {
        mnuFSave.setEnabled(true);
        pnlPrincipal.removeAll();
        pnlPrincipal.add(pnlJeu);
        pnlPrincipal.getRootPane().revalidate();
        pnlPrincipal.repaint();
    }
/**
 * Initialise les options
 */
    public void initOptions() {
        pnlPrincipal.removeAll();
        pnlPrincipal.add(pnlOptions);
        pnlPrincipal.getRootPane().revalidate();
        pnlPrincipal.repaint();
        
    }
/**
 * Initialise le menu principal
 */
    public void initPnlMenu() {
        mnuFSave.setEnabled(false);
        pnlPrincipal.removeAll();
        pnlPrincipal.add(menu);
        pnlPrincipal.getRootPane().revalidate();
        pnlPrincipal.repaint();
       
    }
/**
 * Incremente les statistiques depuis l'ouverture du programme
 * @param joueur nom du joueur
 */
    public static void incrementStat(int joueur) {
        nbVictoire[joueur-1] =+ 1;
    }
/**
 * Initialise les statistiques
 */
    private void initStats() {
        int nbPartie = 0;
        for(int i = 0; i < nbVictoire.length; i++) {
            nbPartie += nbVictoire[i];
        }
        JOptionPane.showMessageDialog(null, "<html>Statistique<br />"
            + "Nb de partie: " + nbPartie + "<br />"
            + "Nb de victoire de " + Options.getNomJoueur(1) + " : " + nbVictoire[0] + "<br />"
            + "Nb de victoire de " + Options.getNomJoueur(2)  + " : " + nbVictoire[1] + "<br />"
            + "Nb de victoire de " + Options.getNomJoueur(3)  + " : " + nbVictoire[1] + "<br />"
            + "Nb de victoire de " + Options.getNomJoueur(4)  + " : " + nbVictoire[1] + "<br />"
            + "<html>");

    }
/**
 * Contient les instructions du jeu
 */
    private void instruction() {
        JOptionPane.showMessageDialog(null, "<html><FONT size=18>Les intenses règles "
                + "du jeu</FONT><BR><BR> <U>Déplacement</U><BR>"
                + "Le jeu sera composé d’un damier de 8x8 cases, où 2 Redd le rond cool et "
                + "culturéTM de couleur différents devront s’affronter<BR>jeu de"
                + " puzzle qui concerne 2 à 4 joueurs humains ayant des couleurs "
                + "de pions différents, placés tels que présenté sur l’image de "
                + "droite. Chacun joue à son tour, où il décide quel pion "
                + "déplacer : <BR><OL><LI>Si le pion est déplacé sur une case "
                + "adjacente à la première case : le pion se dédouble (il reste "
                + "sur la case de départ, et une copie du pion se place sur la "
                + "case cliquée adjacente.</LI><LI>Si le pion est déplacé à "
                + "exactement 2 cases de distance, le pion de la case de départ "
                + "est perdu mais vous prenez possession de la case éloignée.</LI>"
                + "</OL><BR>Vous pouvez vous déplacer dans tous les sens sur "
                + "le plateau de jeu.<BR><U>Tous les autres déplacements sont "
                + "interdits.</U><BR>Lorsque le pion déplacé arrive sur une case "
                + "adjacente à une autre couleur, tous les pions de la couleur "
                + "ennemie prennent la couleur du pion déplacé (grâce à l’aura "
                + "cool et culturé de Redd, bien entendu).<BR><BR><U>Super Red</U>"
                + "<BR>Une fois dans la partie, pour chacun des joueurs, il est "
                + "possible de placer sur le jeu un pion SuperRedd (qui suit "
                + "les règles de déplacement des pions normaux). Ce SuperPion :"
                + "<BR><UL><LI>Appartiendra toujours au même joueur, il est donc"
                + " impossible de le changer de couleur</LI><LI>Toutes les cases"
                + " qui ont étés changés par SuperRedd le tour qu’il a été placé"
                + " ne pourront plus être changés de couleur durant la partie en cours."
                + "</LI><LI>Peut être utilisé les tours suivants comme s’il était"
                + " un pion normal.</LI></UL><BR><BR><U>Fin de la partie</U>"
                + "<UL><LI>Soit lorsqu’il n’y a plus qu’une seule couleur de "
                + "pion sur le jeu.</LI><LI>Soit lorsqu’il ne reste plus d’espace"
                + " libre sur le plateau de jeu. Alors, le gagnant est le joueur"
                + " ayant le plus de pion sur le jeu.</LI><LI>Soit un joueur "
                + "abandonne</LI><UL><BR><BR> <FONT size=14>Bonne Partie</FONT><html>");
    }
/**
 * Permet de sauvegarder la partie en cour et de vérifier si une partie de ce nom existe deja
 */
    private void saveGame() {
        String fileName;
        String filePath;
        Pattern pattern;
        Matcher matcher;

        pattern = Pattern.compile("^.*(.redd)$");

        try {
            JFileChooser choix = new JFileChooser();
            FileNameExtensionFilter filter1 = new FileNameExtensionFilter("Fichier .redd", "redd");
            choix.addChoosableFileFilter(filter1);
            int save = choix.showSaveDialog(null);
            if (save == JFileChooser.APPROVE_OPTION) {
                File file = choix.getSelectedFile();
                fileName = file.getName();
                filePath = file.getAbsolutePath();
                matcher = pattern.matcher(fileName);

                if (!matcher.find()) {
                    filePath = filePath + ".redd";
                }
                java.io.File f = new java.io.File(filePath);
                if (f.exists()) {
                    int reponse = JOptionPane.showConfirmDialog(null,
                            "Le fichier de ce nom existe déjà, voulez enregistrer par-dessus?",
                            "Fichier existant",
                            JOptionPane.YES_NO_OPTION);
                    if (reponse == JOptionPane.YES_OPTION) {

                    } else {
                        saveGame();
                        return;
                    }
                }
                FileOutputStream fos =
                        new FileOutputStream(filePath);
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(pnlJeu);
                oos.flush();
                oos.close();
                initGentilJeu();
                initPnlMenu();
                mnuFSave.setEnabled(false);

            }
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
/**
 * Permet d'ouvrir une partie deja enregistrer prealablement
 */    private void openGame() {
        String fileName;
        String filePath;
        Pattern pattern;
        Matcher matcher;
        pattern = Pattern.compile("^.*(.redd)$");
        try {
            JFileChooser ouvrir = new JFileChooser();
            FileNameExtensionFilter filter1 = new FileNameExtensionFilter("Fichier .redd", "redd");
            ouvrir.addChoosableFileFilter(filter1);
            int fichierOuvrir = ouvrir.showOpenDialog(null);

            if (fichierOuvrir == JFileChooser.APPROVE_OPTION) {
                File file = ouvrir.getSelectedFile();
                fileName = file.getName();
                filePath = file.getAbsolutePath();
                matcher = pattern.matcher(fileName);
                if (!matcher.find()) {
                    filePath = filePath + ".redd";
                }
                FileInputStream fichier = new FileInputStream(filePath);
                ObjectInputStream ois = new ObjectInputStream(fichier);

                pnlJeu = (Jeu) ois.readObject();
                
                initGentilJeu();
                ois.close();
            }
        } catch (java.io.FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "Le fichier n'existe pas");
            e.printStackTrace();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void getGame() {
        openGame();
    }

/**
 * Gère les évènements de la classe fenetre
 */
    class GererEvenement implements ActionListener {
/**
 * Gere les évènements sur le menu bar
 * @param ae
 */
        public void actionPerformed(ActionEvent ae) {
            if (ae.getSource() == mnuFExit) {
                System.exit(0);
            } else if (ae.getSource() == mnuFNewGame) {
                initJeu();
                mnuFSave.setEnabled(true);
            } else if (ae.getSource() == mnuFOpenGame) {

                openGame();


            } else if (ae.getSource() == mnuFSave) {
                saveGame();
            } else if (ae.getSource() == mnuAHelp) {
                instruction();
            } else if (ae.getSource() == mnuAStats) {
                initStats();
            } else if (ae.getSource() == mnuAPropos) {
                JOptionPane.showMessageDialog(null, "<html><FONT size=12>À propos"
                        + "</FONT><BR><BR> Réalisation par : <BR><UL><LI>"
                        + "Philippe Deslauriers</LI><LI>Vincent Fournier</LI>"
                        + "<LI>Patrice Deschênes</LI></UL><BR><BR>Idée originale :"
                        + "<UL><LI>Mathieu Grenon</LI><UL></html>");
            }
        }
    }
}
